package com.八股文.动态代理.CGLIB动态代理;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;

// 1. 目标类（无需实现接口）
class OrderService {
    public void createOrder(String orderId) {
        System.out.println("创建订单：" + orderId);
    }
}

// 2. 实现MethodInterceptor（增强逻辑）
class MyMethodInterceptor implements MethodInterceptor {
    // 目标对象
    private Object target;

    public MyMethodInterceptor(Object target) {
        this.target = target;
    }

    // 代理对象的方法被调用时，会触发intercept方法
    @Override
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        // 前置增强
        System.out.println("===== 开始执行：" + method.getName() + "，订单ID：" + args[0] + " =====");

        // 调用目标对象的原始方法
        Object result = method.invoke(target, args);

        // 后置增强
        System.out.println("===== 执行结束：" + method.getName() + " =====");

        return result;
    }
}

// 测试类
public class CglibProxyDemo {
    public static void main(String[] args) {
        // 目标对象
        OrderService target = new OrderService();

        // 创建Enhancer（CGLIB的核心类）
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass()); // 设置父类（目标类）
        enhancer.setCallback(new MyMethodInterceptor(target)); // 设置增强器

        // 生成代理对象（是目标类的子类）
        OrderService proxy = (OrderService) enhancer.create();

        // 调用代理对象的方法
        proxy.createOrder("ORDER_123456");
    }
}